home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / filcp / filcp.c next >
Text File  |  1993-11-30  |  5KB  |  195 lines

  1. /*-------------------------------------------------------------*/
  2. /*          FILCP.C FILE COPY              v1.00 93/08/01      */
  3. /*-------------------------------------------------------------*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <dos.h>
  7. #include <string.h> 
  8. #include <process.h> 
  9.  
  10. void filecopy(char *infile, char *otfile);
  11. void errmes_exit(void);
  12. int seekchr(const char *moji, char  cr);
  13. long int dskchk(int dv_no);
  14.  
  15. union REGS inregs,outregs;
  16. struct SREGS segregs;
  17. struct find_t f;
  18.  
  19. int cnt=0,dno;
  20. long int fi_size;
  21. long int fo_size;
  22.  
  23. main(int argc, char *argv[])
  24. {
  25.    int i,j,noi,ci0,ci1,ci2;
  26.    char fin_name[40];
  27.    char fin1_name[40];
  28.    char fin2_name[40];
  29.    char dv_name;
  30.    char fo_name[40];
  31.    char *fot_name;
  32.    char fot1_name[40];
  33.    char f_name[40];
  34.  
  35.    if(argc<3)                                     errmes_exit();
  36.    strcpy(fo_name,argv[argc-1]);
  37.    if(fo_name[1] != ':')                          errmes_exit();
  38.    fot_name=&fo_name[0];
  39.    dv_name=toupper(fo_name[0]);
  40.    dno=(int)dv_name-0x41;
  41.    if(fot_name[strlen(fot_name)-1] !='\\') strcat(fot_name,"\\");
  42.    printf("\n   many files copy utility v1.00    by  m.i  \n\n");
  43.  
  44.    for(i=1;i<argc-1;i++)
  45.    {
  46.      noi=0,ci0=0,ci1=0,ci2=0,j=0;
  47.      strcpy(fin_name,argv[i]);
  48.      noi=strlen(fin_name);
  49.      ci0=seekchr(fin_name,'\\');
  50.      ci1=seekchr(fin_name,':');    
  51.  
  52.         if(ci0<noi)
  53.         {
  54.              strncpy(fin1_name,fin_name,ci0+1);
  55.              fin1_name[ci0+1]='\0';
  56.          } 
  57.         else if(ci1<noi){
  58.                strncpy(fin1_name,fin_name,ci1+1);
  59.                fin1_name[ci1+1]='\0';
  60.               }
  61.      else {
  62.         fin1_name[0]='\0';
  63.           }
  64.  
  65.         while (1){
  66.          if (j==0) 
  67.          {
  68.               if((_dos_findfirst(argv[i],0x16,&f))!=0)
  69.               { 
  70.                 printf("\a\ninput %-20s  ファイルが存在しません\n",argv[i]);
  71.                                             break;
  72.               } 
  73.          }
  74.          else if((_dos_findnext(&f))!=0)    break;
  75.  
  76.              j++;
  77.              strcpy(fot1_name,fot_name);
  78.              strcpy(fin2_name,fin1_name);
  79.              strcat(fin2_name,f.name);
  80.          fi_size=f.size;
  81.              filecopy(fin2_name,fot1_name);
  82.         }
  83.    }
  84.      printf("\n   %d 個のファイルをコピーしました。\n",cnt); 
  85.      printf("  %c : は %ld バイトが使用可\能\です \n",dno+0x41,dskchk(dno));
  86. }
  87.  
  88. void filecopy(char *infile, char *otfile)
  89.   {
  90.         FILE *fi;
  91.         FILE *fo;
  92.         char *f_name;
  93.         char f_name1[40];
  94.         char f_name2[40];
  95.         char cmnd[80];
  96.         int  ch,no=0,c0=0,c1=0;
  97.  
  98.       if((fi=fopen(infile,"rb")) == NULL)
  99.       {
  100.          printf("\ninput %-20s  がオープンできません\n",infile);
  101.          return ;
  102.       }
  103.  
  104.        strcpy(f_name1,infile);
  105.        no=strlen(f_name1);
  106.        c0=seekchr(f_name1,'\\');
  107.        c1=seekchr(f_name1,':');    
  108.  
  109.        if(c0<no)
  110.        {
  111.              f_name=&f_name1[c0+1];
  112.        } 
  113.        else if(c1<no){
  114.              f_name=&f_name1[c1+1];
  115.             }
  116.        else{   
  117.              f_name=&f_name1[0] ;
  118.             }
  119.  
  120.        strcat(otfile,f_name);
  121.  
  122.        if((fo=fopen(otfile,"rb")) != NULL)
  123.        {
  124.          printf("\noutput %-20s が既に存在しています\n",otfile);
  125.      fclose(fi);
  126.      fclose(fo);
  127.          return ;
  128.     }
  129.        fo_size=dskchk(dno);
  130.        if(fi_size>=fo_size)
  131.        {
  132.         printf("\a\n !! DISK がいっぱいです。 !! \n");
  133.            printf("      コピーを終了します。 \n");
  134.            printf("\n   %d 個のファイルをコピーしました。\n",cnt);
  135.            exit(1);
  136.        }
  137.        if((fo=fopen(otfile,"wb")) == NULL)
  138.        {
  139.          printf("\noutput %-20s がオープンできません\n",otfile);
  140.      fclose(fi);
  141.          return ;
  142.         }
  143.        printf("\ncopy %-20s ->  %-20s \n",infile,otfile);
  144.        if(f.attrib & _A_HIDDEN)
  145.        {
  146.          while((ch=getc(fi)) !=EOF)          putc(ch,fo);
  147.          printf("        hidden file 1個をコピーしました. \n");
  148.           fclose(fi);
  149.           fclose(fo); 
  150.           cnt++;
  151.           return;
  152.         }
  153.        else{
  154.          fclose(fi);
  155.          fclose(fo); 
  156.          strcpy(cmnd,"copy ");
  157.          strcat(cmnd,infile);
  158.          strcat(cmnd," ");
  159.          strcat(cmnd,otfile);
  160.          system(cmnd);
  161.          cnt++;
  162.        }
  163.   }
  164.  
  165.  int seekchr(const char *moji, char  c)
  166.    {
  167.         int i,len;
  168.         len=strlen(moji);
  169.         for(i=len;i>=0;i--)
  170.         {
  171.         if(moji[i]==c) return i;
  172.         }          
  173.         return len;
  174.     } 
  175.  
  176.  long int dskchk(int dv_no)
  177.   {
  178.        inregs.h.ah=0x36;
  179.        inregs.h.dl=dv_no+1;
  180.        intdos(&inregs,&outregs);
  181.        return((long)outregs.x.ax*outregs.x.bx*outregs.x.cx);
  182.   }
  183.  
  184. void errmes_exit(void)
  185.  {
  186.    printf("使用方法:\n\n");
  187.    printf("filcp ファイル1 ファイル2 ファイル3 ・・・   コピー先ドライブ\n\n");
  188.    printf("        複数のファイルをコピー先ドライブにコピーします。\n");
  189.    printf("        コピー先ディレクトリを省略するとルートディレクトリにコピーされます。\n");
  190.    printf("        同名のファイルがコピー先にあった場合は、コピーしません。\n");
  191.    printf("        ワイルドカードも使用できます。\n\n");
  192.    printf("ex;     F>filcp a:aaa.exe a:aaa.c d:*.doc e:?bb.dat a:ccc.* b:[\\xxx]\n\n");
  193.    exit(1);
  194.   }
  195.